/*
    解题思路:
         我们构造一个算法, 从s的start为止开始, 用index指针向后遍历寻找t的母串
            1   用index从start开始向后遍历, 当第一次成功找到母串时,
                该母串必然是从start开始的最短母串,
                已经没必要以start为起点继续遍历寻找其他母串
            2   对于index所扫描过的字符, 如果它曾出现过在t当中(出现次数>0),
                那么我们统计它被扫描过的次数, 如果累计次数等于在t中出现的次数,
                我们累计成功匹配的字符数量+1
                如果成功匹配的字符数量等于t中出现过的所有字符数量,
                我们认为找到了母串 
            3   当找到一个母串时, 我们从母串的头部(start)开始向后扫描,
                去掉所有不妨碍母串继续成立的字符(出现次数过多或者未曾在t中出现)
                直到start所指向的字符在母串中出现的次数刚好等于在t中出现的次数,
                得到的当前母串是到index为止的最短母串 注意推进start时越过的字符,
                我们要对其使用次数-1, 以保持累计数组中记录的是当前母串中各字符的准确出现次数
            4   找到母串后, 与之前记录下的最优母串作对比, 留下更优的记录
            5   如果找不到母串, 整个s中必然不再存在任何其他母串, 直接退出搜索
            6   推进start指向下一个字符, 对被跳过的字符使用次数-1,
                对已经成功匹配的字符数量计数-1 
            7   将index从当前为止前推进, 继续寻找下一个母串,
                直到index指向0字符(字符串结束符)为止
*/
#include <stddef.h> //使用其中定义的size_t类型
#include <stdio.h>

char t[500001], s[500001];                // 定义母串和子串
int t_char_count[256], s_char_count[256]; // 定义母串和子串中各字符出现次数
int main() {
  int t_char_used = 0,
      match_count =
          0; // 定义子串中出现过的字符总数, 和当前母串中已经成功匹配的字符总数
  fgets(s, 500000, stdin); // 读入母串
  fgets(t, 500000, stdin); // 读入子串
  for (char *i = t; *i; i++)
    if (++t_char_count[*i] == 1) // 对子串中出现过的字符进行统计
      t_char_used++;             // 子串中出现过的字符总数+1
  char *start = s, *index = s, *found_start = NULL,
       *found_end = NULL; // 定义母串的指针及已匹配的母串位置
  size_t found_len = 0;   // 定义已匹配的母串长度, size_t是保证可以用来保存地址运算结果的整数类型
  while (*start) {        // 遍历母串
    while (*index) {      // 遍历母串尾巴
      if (t_char_count[*index]) // 如果母串中的字符在子串中出现
        if (++s_char_count[*index] ==
            t_char_count[*index]) // 母串中成功匹配的字符数量+1
          if (++match_count ==
              t_char_used) // 如果母串中的匹配成功数等于子串中用过的字符总数
            break; // 成功匹配母串, 跳出
      index++;     // 指向下一个字符
    }
    if (*index) { // 如果成功匹配母串
      index++;  // index指向母串结束后的下一个字符准备继续寻找母串
      while (start < index) {       // 从母串的头部开始向后扫描
        if (t_char_count[*start]) { // 如果母串中的字符在子串中出现
          if (s_char_count[*start] ==
              t_char_count[*start]) { // 如果出现次数刚好相同, 找到最优母串,
                                      // 跳出
            break;
          } else { // 否则母串中的该字符出现次数-1, 抛弃该字符
            s_char_count[*start]--;
          }
        }
        start++; // 指向下一个字符
      }
      size_t len =
          (size_t)index -
          (size_t)start; // 用地址差计算当前母串长度,
                         // size_t是与地址数据大小一致的整数类型,
                         // 用size_t确保在32位与64位系统中都可以正常运行
      if (found_start) {       // 如果之前已经记录了一个最优母串
        if (len < found_len) { // 如果当前母串更短
          found_start = start; // 覆盖最优母串记录
          found_end = index;
          found_len = len;
        } else if (len == found_len) { // 如果长度相同
          for (char *i = start, *j = found_start; i != index && *i == *j;
               i++, j++) // 逐个字符扫描比较, 直到找到不同字符或到达末尾
            if (i < index && *i < *j) { // 如果没有扫描完成且当前母串字典法排前面
              found_start = start;      // 覆盖最优母串记录
              found_end = index;
              found_len = len;
              break;
            }
        }
      } else {  // 如果没有记录最优母串
        found_start = start;   //当前记录为最优母串
        found_end = index;
        found_len = len;
      }
    } else          // 没有成功匹配母串
      break;        // 搜寻结束, 跳出
    s_char_count[*start]--;         // 由于找到母串成功, start指向的字符必在t出现过, 跳过该字符出现次数-1
    match_count--;   //start指向的字符出现次数必然与在t中的出现次数相同, 跳过该字符导致匹配成功字符数量-1
    start++;    //指向下一个字符
  }
  if (found_start) {   // 如果找到最优母串
    *found_end = 0;  //在最优母串结束位置写入字符串结束符
    printf("%s\n", found_start);  //输出最优母串
  } else
    printf("\n");       //输出空行
}